// 解题思路：
// 定义指针 right 从左向右遍历数组
// 定义哈希表保存遍历过的数字
// 采用滑动窗口的方式：
// 进窗口 - 将数字保存到哈希表
// 判断该数字的出现次数是否大于 1：
// 如果大于 1，出窗口，定义 left 从 0 开始出窗口，直至等于 1，更新结果；如果不大于 1，继续进窗口
// 返回结果

import java.util.HashSet;
import java.util.Set;

public class SubArray {
    public int maxLength1 (int[] arr) {
        // write code here
        int n = arr.length;
        int left = 0;
        int right = 0;
        int[] hash = new int[100010];
        int ret = 0;
        while(right < n){
            hash[arr[right]]++;
            while(hash[arr[right]] > 1){
                hash[arr[left]]--;
                left++;
            }
            ret = Math.max(ret, right - left + 1);
            right++;
        }
        return ret;
    }
    public int maxLength2 (int[] arr) {
        // write code here
        int n = arr.length;
        int left = 0;
        int right = 0;
        Set<Integer> hash = new HashSet<>();
        int ret = 0;
        while(right < n){
            while(hash.contains(arr[right])){
                hash.remove(arr[left]);
                left++;
            }
            hash.add(arr[right]);
            ret = Math.max(ret, right - left + 1);
            right++;
        }
        return ret;
    }
}
